import axios from "axios";
import { UN_LOGIN } from './errorCode.js';
const CancelToken = axios.CancelToken;
const cancelRequest = {};  // 用于存储需要取消的请求

// axios实例化
const instance = axios.create({
  timeout: 5000,
  withCredentials: true,
  headers: {
    'Content-Type': 'application/json'
  }
});

// 添加请求拦截器
instance.interceptors.request.use(function (config) {
  // if (!Login.isLogin() && config.isLogin) {
  //   Login.gotoLogin();
  // }
  // 解决get请求不会带content-type的问题
  if (config.method === 'get') {
    config.data = {unused: 0};
  }
  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器
instance.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。
  console.log('--instance.interceptors.response--', response);
  // 精简返回结构
  let { data, config } = response;
  // 解决服务端会把部分接口处理成jsonp请求的
  if (typeof data === 'string' && data.includes('({')) {
    // const callbackName = config.params && config.params.callback ? config.params.callback : '';
    // const regx = new RegExp(callbackName+'\(|\)', 'g');
    const dataNeeds = data.match(/\((.+)\)/);
    if (dataNeeds && dataNeeds.length > 0) {
      data = JSON.parse(dataNeeds[1]);
    }
  }
  // 如果检测到未登录，且这些接口是需要登录的
  if (data.code === UN_LOGIN && config.isLogin) {
    // Login.gotoLogin();
    // TODO: 登录提示
    return data;
  }
  if (!data.success) {
    // TODO：错误提示
    // message.info(data.message);
  }
  if (config.url && cancelRequest[config.url]) {
    cancelRequest[config.url] = null;
  }
  return data;
}, function (error) {
  if (error.config && cancelRequest[error.config.url]) {
    cancelRequest[error.config.url] = null;
  }
  return Promise.reject(error);
});

/**
 * get请求
 * @param { String } url 请求地址
 * @param { Object } params 请求参数
 * @returns 
 */
const get = (url, params, config) => {
  try {
    if (cancelRequest[url]) {
      cancelRequest[url]();
      cancelRequest[url] = null;
    }
  } catch(err){}
  return instance.get(url, {
    params,
    ...config,
    cancelToken: new CancelToken(function executor(c) {
      // executor 函数接收一个 cancel 函数作为参数
      cancelRequest[url] = c;
    })
  }, {
    
  })
}

/**
 * post请求
 * @param { String } url 请求地址
 * @param { Object } params 请求参数
 * @returns 
 */
 const post = (url, data, config) => {
  if (cancelRequest[url]) {
    cancelRequest[url]();
    cancelRequest[url] = null;
  }
  return instance.post(url, data, {
    config,
    cancelToken: new CancelToken(function executor(c) {
      // executor 函数接收一个 cancel 函数作为参数
      cancelRequest[url] = c;
    })
  })
}

export default {
  get,
  post
}